package main

import "fmt"

// 整型 - 重新开辟内存
func v1() {
	var v1 int = 1
	v2 := v1
	fmt.Printf("v1 =%p, v2 =%p", &v1, &v2)
}

// 布尔类型 - 重新开辟内存
func v2() {
	var v1 bool = false
	v2 := v1
	fmt.Printf("v1 =%p, v2 =%p", &v1, &v2)
}

// 浮点型 - 重新开辟内存
func v3() {
	var v1 float32 = 3.14
	v2 := v1
	fmt.Printf("v1 =%p, v2 =%p", &v1, &v2)
}

// 字符串 - 重新开辟内存. 指针地址不变
func v4() {
	// 存储一个字符串，变量里面存储的是一个指针和一个长度
	// 指针会指向具体存储变量的内存地址
	var v1 string = "muc"

	// 字符串赋值时， 赋值的变量会存储一个指针，一个长度
	// 指针指向的内存地址和原字符串相同
	v2 := v1
	fmt.Printf("v1 =%p, v2 =%p", &v1, &v2)
}

// 数组 - 重新开辟内存地址
func v5() {
	var v1 = [2]int{6, 9}
	v2 := v1
	v2[0] = 111
	fmt.Println(v1)
	fmt.Println(v2)
	fmt.Printf("v1 =%p, v2 =%p", &v1, &v2)
}

// 切片 - 数据存储的地址不重新开辟内存地址
func v6() {
	// 切片中存储了 一个长度， 一个容量， 一个数组
	var v1 = []int{1, 2, 3, 4}
	//v1 = append(v1, 1, 2, 3, 4)

	// 切片赋值时， 会开辟一个新的地址， 里面有长度，容量，数组
	// 新的切片，与原切片指向的数据地址是同一块内存
	// 当赋值切片改变数据时， 原切片随之改变
	v2 := v1
	v2[0] = 1111
	fmt.Println(v1)
	fmt.Println(v2)
	fmt.Printf("v1 =%p, v2 =%p\n", &v1, &v2)

	// 当原切片扩容时， 原切片开辟新的内存地址， 新切片改变元素值时， 原切片不会随之改变
	v1 = append(v1, 9999, 10000, 1111, 2222, 1, 2, 3, 4, 54, 6)
	v2[0] = 10101
	fmt.Println(v1)
	fmt.Println(v2)
	fmt.Printf("v1 =%p\n", &v1)
	fmt.Printf("v2 =%p\n", &v2)

}
